www.gusucode.com > VC++ SYN高速端口扫描器源代码-源码程序 > VC++ SYN高速端口扫描器源代码-源码程序/code/SynScanPort/SynScanPortDlg.cpp

    //Download by http://www.NewXing.com
// SynScanPortDlg.cpp : implementation file
//

#include "stdafx.h"
#include <winsock2.h> 
#include "SynScanPort.h"
#include "SynScanPortDlg.h"
#include "Ping.h"
#include <ws2tcpip.h> 
#include <stdio.h> 
#pragma comment(lib,"ws2_32.lib") 

#if _MSC_VER > 1000
#pragma once
#endif
#define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1)
#define SIO_RCVALL_MCAST      _WSAIOW(IOC_VENDOR,2)
#define SIO_RCVALL_IGMPMCAST  _WSAIOW(IOC_VENDOR,3)
#define SIO_KEEPALIVE_VALS    _WSAIOW(IOC_VENDOR,4)
#define SIO_ABSORB_RTRALERT   _WSAIOW(IOC_VENDOR,5)
#define SIO_UCAST_IF          _WSAIOW(IOC_VENDOR,6)
#define SIO_LIMIT_BROADCASTS  _WSAIOW(IOC_VENDOR,7)
#define SIO_INDEX_BIND        _WSAIOW(IOC_VENDOR,8)
#define SIO_INDEX_MCASTIF     _WSAIOW(IOC_VENDOR,9)
#define SIO_INDEX_ADD_MCAST   _WSAIOW(IOC_VENDOR,10)
#define SIO_INDEX_DEL_MCAST   _WSAIOW(IOC_VENDOR,11)

struct tcp_keepalive {
    u_long  onoff;
    u_long  keepalivetime;
    u_long  keepaliveinterval;
};

#define srcPort 88 

char srcIP[20] = "";//定义源地址 
int  StartPort,EndPort;
CSynScanPortDlg *dlg=NULL;

typedef struct ip_hdr 
{ 
    unsigned char h_verlen; //4位首部长度,4位IP版本号 
    unsigned char tos; //8位服务类型TOS 
    unsigned short total_len; //16位总长度(字节) 
    unsigned short ident; //16位标识 
    unsigned short frag_and_flags; //3位标志位 
    unsigned char ttl; //8位生存时间 TTL 
    unsigned char proto; //8位协议 (TCP, UDP 或其他) 
    unsigned short checksum; //16位IP首部校验和 
    unsigned int sourceIP; //32位源IP地址 
    unsigned int destIP; //32位目的IP地址 
}IP_HEADER; 

typedef struct tcp_hdr //定义TCP首部 
{ 
    USHORT th_sport; //16位源端口 
    USHORT th_dport; //16位目的端口 
    unsigned int    th_seq; //32位序列号 
    unsigned int    th_ack; //32位确认号 
    unsigned char th_lenres; //4位首部长度/6位保留字 
    unsigned char th_flag; //6位标志位 
    USHORT th_win; //16位窗口大小 
    USHORT th_sum; //16位校验和 
    USHORT th_urp; //16位紧急数据偏移量 
}TCP_HEADER; 

typedef struct tsd_hdr //定义TCP伪首部 
{ 
    unsigned long saddr; //源地址 
    unsigned long daddr; //目的地址 
    char mbz; 
    char ptcl; //协议类型 
    unsigned short tcpl; //TCP长度 
}PSD_HEADER;

int recv_packet()
{ 
    SOCKADDR_IN     sniff; 
    SOCKET          sock; 
    char            recvBuffer[65000] = "";

    sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 

    sniff.sin_family = AF_INET; 
    sniff.sin_port = htons(0); 
    sniff.sin_addr.s_addr = inet_addr(srcIP); 

    bind(sock,(PSOCKADDR)&sniff,sizeof(sniff)); 

    DWORD dwBufferLen[10] ; 
    DWORD dwBufferInLen = 1; 
    DWORD dwBytesReturned = 0 ; 
    WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL); 

	printf("Sniffer On %s is OK...\n",srcIP); 
    while(TRUE) 
    { 
        memset(recvBuffer,0,sizeof(recvBuffer));
        int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0); 
        if(bytesRecived <= 0)
            continue;
		IP_HEADER        *ipHeader;
		TCP_HEADER       *tcpHeader;
		ipHeader = (IP_HEADER *)recvBuffer; 
		tcpHeader = (TCP_HEADER *) (recvBuffer+sizeof(IP_HEADER));
		//if(tcpHeader->th_seq == 0x12345678+2)
		{
			if(tcpHeader->th_flag == 18)
			{
				char result[50];
				in_addr addr;
				addr.s_addr = ipHeader->sourceIP;
				wsprintf(result,"[Found]   %-15s   %-5d\r\n",inet_ntoa(addr),ntohs(tcpHeader->th_sport)); 
				dlg->m_show += result;
				dlg->SetDlgItemText(IDC_RICHEDIT_SHOW,dlg->m_show);
			}
		}
	}
    return 1;
}

USHORT checksum(USHORT *buffer, int size) 
{ 
    unsigned long cksum=0; 

    while(size >1) 
    { 
        cksum += *buffer++; 
        size -= sizeof(USHORT); 
    } 
    if(size) 
    { 
        cksum += *(UCHAR*)buffer; 
    } 
    cksum = (cksum >> 16) + (cksum & 0xffff); 
    cksum += (cksum >> 16); 
    return (USHORT)(~cksum); 
}

int send_packet(void *targetIP) 
{
	WSADATA               WSAData;
	WSAStartup(MAKEWORD(2,1) ,&WSAData);

    SOCKET             sendSocket; 
    BOOL               flag; 
    int                timeout; 
    SOCKADDR_IN        sin; 
    IP_HEADER          ipHeader; 
    TCP_HEADER         tcpHeader; 
    PSD_HEADER         psdHeader; 
    char               szSendBuf[60] = ""; 

    if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) 
    { 
        printf("Socket Setup Error...\n"); 
        return 0; 
    } 
    if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR) 
    { 
        printf("Setsockopt IP_HDRINCL Error...\n"); 
        return 0; 
    } 

    timeout = 1000; 
    if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR) 
    { 
        printf("Setsockopt SO_SNDTIMEO Error...\n"); 
        return 0; 
    }

    ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); 
    ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader)); 
    ipHeader.ident = 1; 
    ipHeader.frag_and_flags = 0x40; 
    ipHeader.ttl = 128; 
    ipHeader.proto = IPPROTO_TCP; 
    ipHeader.checksum = 0; 
    ipHeader.sourceIP =  inet_addr(srcIP);
    ipHeader.destIP = inet_addr((char *)targetIP);

    tcpHeader.th_sport = htons(srcPort);
    tcpHeader.th_seq = 0x12345678; 
    tcpHeader.th_ack = 0; 
    tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0); 
    tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推测,哈哈) 
    tcpHeader.th_win = htons(512); 
    tcpHeader.th_urp = 0; 
    tcpHeader.th_sum = 0; 

    psdHeader.saddr = ipHeader.sourceIP;
    psdHeader.daddr = ipHeader.destIP;
    psdHeader.mbz = 0; 
    psdHeader.ptcl = IPPROTO_TCP; 
    psdHeader.tcpl = htons(sizeof(tcpHeader)); 

	for(int tmp = StartPort; tmp <= EndPort; tmp++)
    {
		ipHeader.checksum = 0; 
        tcpHeader.th_sum = 0;
		tcpHeader.th_dport = htons(tmp);
		sin.sin_family = AF_INET; 
		sin.sin_port = htons(tmp); 
		sin.sin_addr.S_un.S_addr = inet_addr((char *)targetIP); 

		memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
		memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 

		tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader)); 
		memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
		memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
		memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4); 
		ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader)); 

		memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
		memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
    
		int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin)); 
		if(ret == SOCKET_ERROR) 
		{ 
			printf("Send Error:%d\n",GetLastError());
			return 0; 
		}
    }
	/*
    memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
    memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 

    tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader)); 
    memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
    memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
    memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4); 
    ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader)); 

    memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
    memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
    
	int ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin)); 
    if(ret == SOCKET_ERROR) 
    { 
        printf("Send Error:%d\n",GetLastError());
        return 0; 
    }*/
    return 1; 
}
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSynScanPortDlg dialog

CSynScanPortDlg::CSynScanPortDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSynScanPortDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSynScanPortDlg)
	m_endport = 65535;
	m_startport = 0;
	m_show = _T("显示结果...\r\n");
	m_ip = _T("192.168.159.1");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSynScanPortDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSynScanPortDlg)
	DDX_Control(pDX, IDOK, m_btnok);
	DDX_Control(pDX, IDC_EDIT_STARTPORT, m_edit_startport);
	DDX_Control(pDX, IDC_EDIT_IP, m_edit_ip);
	DDX_Control(pDX, IDC_EDIT_ENDPORT, m_edit_endport);
	DDX_Control(pDX, IDC_BUTTON_PING, m_btn_ping);
	DDX_Control(pDX, IDC_BUTTON_OUT, m_btn_out);
	DDX_Control(pDX, IDC_BUTTON_CLEAN, m_btn_clean);
	DDX_Text(pDX, IDC_EDIT_ENDPORT, m_endport);
	DDX_Text(pDX, IDC_EDIT_STARTPORT, m_startport);
	DDX_Text(pDX, IDC_RICHEDIT_SHOW, m_show);
	DDX_Text(pDX, IDC_EDIT_IP, m_ip);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSynScanPortDlg, CDialog)
	//{{AFX_MSG_MAP(CSynScanPortDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_OUT, OnButtonOut)
	ON_BN_CLICKED(IDC_BUTTON_CLEAN, OnButtonClean)
	ON_BN_CLICKED(IDC_BUTTON_PING, OnButtonPing)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSynScanPortDlg message handlers

BOOL CSynScanPortDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	m_wndLink1.SubclassDlgItem(IDC_URL1, this);

	m_btnok.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
	m_btnok.SetFontColor(RGB(100,50,280));
	m_btn_ping.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
	m_btn_ping.SetFontColor(RGB(100,50,280));
	m_btn_out.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
	m_btn_out.SetFontColor(RGB(100,50,280));
	m_btn_clean.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4);
	m_btn_clean.SetFontColor(RGB(100,50,280));

	// TODO: Add extra initialization here
	char FAR              hostname[128] = ""; 
    struct hostent        *phe; 
	WSADATA               WSAData;
	WSAStartup(MAKEWORD(2,1) ,&WSAData);
    gethostname(hostname,128);
    phe = gethostbyname(hostname);
	if(phe == NULL) 
		exit(0);
    strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));
	SetDlgItemText(IDC_EDIT_IP,srcIP);
	StartPort = 0;
	EndPort = 0;
	dlg = this;
	CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,NULL); 
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSynScanPortDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSynScanPortDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CSynScanPortDlg::OnOK() 
{
	UpdateData(TRUE);
	StartPort = m_startport;
	EndPort = m_endport;
	AfxBeginThread((AFX_THREADPROC)send_packet,(void *)m_ip.GetBuffer(0));
}


void CSynScanPortDlg::OnButtonOut() 
{
	CFileDialog fileDialog(TRUE,"*.txt",NULL,NULL,"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
	if (fileDialog.DoModal() == IDOK) 
	{
		CString m_file = fileDialog.GetPathName();
		CFile file;
		file.Open(m_file,CFile::modeCreate|CFile::modeWrite);
		file.Write(m_show.GetBuffer(0),m_show.GetLength());
		file.Write("\r\n\r\n\t\tby 特南克斯\r\n",strlen("\r\n\r\n\t\tby 特南克斯\r\n"));
		file.Close();
		MessageBox("导出成功","导出列表");
	}
}

void CSynScanPortDlg::OnButtonClean() 
{
	m_show="显示结果...";
	UpdateData(FALSE);
}

void CSynScanPortDlg::OnButtonPing() 
{
	UpdateData(TRUE);
	CPing ping;
	ping.SetConfigure(m_ip.GetBuffer(0),32,4);
	ping.Ping(1000);
	CString str;
	str.Format("%s",ping.msg);
	m_show+=str;
	UpdateData(FALSE);
}

void CSynScanPortDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	::SendMessage(this->GetSafeHwnd(),WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);	
	CDialog::OnLButtonDown(nFlags, point);
}